{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Appendix A: Tuning BM25 parameters for the MSMARCO Document dataset\n",
    "\n",
    "The following shows a principled, data-driven approach to tuning BM25 parameters with a basic query, using the MSMARCO Document dataset. This assumes familiarity with basic query tuning as shown in the \"Query tuning\" notebooks.\n",
    "\n",
    "BM25 contains two parameters `k1` and `b`. Roughly speaking (very roughly), `k1` controls the amount of term saturation (at some point, more terms does not mean more relevant) and `b` controls the importance of document length. A deeper look into these parameters is beyond the scope of this notebook, but our [three part blog series on understanding BM25](https://www.elastic.co/blog/practical-bm25-part-1-how-shards-affect-relevance-scoring-in-elasticsearch) is very useful for that.\n",
    "\n",
    "Be aware that not all query types will see improvements with BM25 tuning. Sometimes it's more impactful to just tune query parameters. As always you try it out with your datasets first and get concrete measurements. We recommend customizing index settings/analyzers first, then do query parmeter tuning and get your baseline measurements. Next, try the best index settings/analyzers with BM25 tuning, then do query parameter tuning and see if it makes any improvement on your baseline. If there's no significant difference it's best to just stick with the default BM25 parameters for simplicty."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import importlib\n",
    "import os\n",
    "import sys\n",
    "\n",
    "from elasticsearch import Elasticsearch\n",
    "from skopt.plots import plot_objective"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# project library\n",
    "sys.path.insert(0, os.path.abspath('..'))\n",
    "\n",
    "import qopt\n",
    "importlib.reload(qopt)\n",
    "\n",
    "from qopt.notebooks import evaluate_mrr100_dev, optimize_bm25_mrr100\n",
    "from qopt.optimize import Config, set_bm25_parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# use a local Elasticsearch or Cloud instance (https://cloud.elastic.co/)\n",
    "es = Elasticsearch('http://localhost:9200')\n",
    "\n",
    "# set the parallelization parameter `max_concurrent_searches` for the Rank Evaluation API calls\n",
    "max_concurrent_searches = 10\n",
    "\n",
    "index = 'msmarco-document'\n",
    "index_defaults = 'msmarco-document.defaults'\n",
    "template_id = 'combined_matches'\n",
    "\n",
    "# no query params\n",
    "query_params = {}\n",
    "\n",
    "# default Elasticsearch BM25 params\n",
    "default_bm25_params = {'k1': 1.2, 'b': 0.75}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Baseline evaluation\n",
    "\n",
    "For tuning the BM25 parameters, we're going to use just a `match` query per field, combined using a `bool` `should` query. This will search for query terms across the `url`, `title`, and `body` fields, and we'll be attempting to optimize the BM25 parameters that are used in the scoring function for each field. In theory, each field could have it's own BM25 [similarty](https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-similarity.html#bm25) and parameters, but we'll leave that as an exercise to the reader.\n",
    "\n",
    "Since BM25 parameters are actually index settings in Elasticsearch (they are theoretically query parameters, but they are implemented as index settings to be consistent with other similarity modules), we need to make sure to set the parameters before any evaluation step. At optimization time, we'lll do the same process: set the BM25 parameters to try, then run the rank evaluation API on the training query dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Evaluation with: MRR@100\n",
      "Score: 0.2504\n",
      "CPU times: user 1.8 s, sys: 436 ms, total: 2.23 s\n",
      "Wall time: 57.4 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "\n",
    "set_bm25_parameters(es, index, **default_bm25_params)\n",
    "\n",
    "_ = evaluate_mrr100_dev(es, max_concurrent_searches, index, template_id, query_params)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "That's the same baseline that we've seen in the \"Query tuning\" notebook, so we know we're setup correctly."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Optimization\n",
    "\n",
    "Now we're ready to run the optimization procedure and see if we can improve on that, while holding the default query parameters constant.\n",
    "\n",
    "We know that there's [roughly a standard range](https://www.elastic.co/blog/practical-bm25-part-3-considerations-for-picking-b-and-k1-in-elasticsearch) for each parameter, so we use those. We also set internally before running the optimization some static initial points to try, based on some well-known default parameter values:\n",
    "\n",
    "  * Elasticsearch defaults: `k1`: `1.2`, `b`: `0.75`\n",
    "  * Anserini [1] defaults: `k1`: `0.9`, `b`: `0.4`\n",
    "  \n",
    "[1] [anserini](https://github.com/castorini/anserini) is a commonly used tool in academia for research into search systems"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Optimizing parameters\n",
      " - metric: MRR@100\n",
      " - queries: data/msmarco-document-sampled-queries.1000.tsv\n",
      " - queries: data/msmarco/document/msmarco-doctrain-qrels.tsv\n",
      " - iteration 2 scored 0.2188 with: {'k1': 0.9, 'b': 0.4}\n",
      " - iteration 3 scored 0.2353 with: {'k1': 3.370604288950908, 'b': 0.6502501160664012}\n",
      " - iteration 4 scored 0.2350 with: {'k1': 4.019769356834095, 'b': 0.6559624038852268}\n",
      " - iteration 5 scored 0.2183 with: {'k1': 4.550172007175469, 'b': 0.36646469797122216}\n",
      " - iteration 6 scored 0.2197 with: {'k1': 4.510703804651055, 'b': 0.9990275259776924}\n",
      " - iteration 7 scored 0.2235 with: {'k1': 1.2557048044556212, 'b': 0.5681787231476463}\n",
      " - iteration 8 scored 0.2218 with: {'k1': 0.9492476027695534, 'b': 0.7428739712003931}\n",
      " - iteration 9 scored 0.2255 with: {'k1': 1.3366685724014589, 'b': 0.5938330471247484}\n",
      " - iteration 10 scored 0.2330 with: {'k1': 4.309783310447555, 'b': 0.7759034485189735}\n",
      " - iteration 11 scored 0.2195 with: {'k1': 1.5781739190991968, 'b': 0.3015016529905641}\n",
      " - iteration 12 scored 0.2347 with: {'k1': 2.321429376689379, 'b': 0.6884699589963544}\n",
      " - iteration 13 scored 0.2134 with: {'k1': 3.2448226638738626, 'b': 0.9900046900427262}\n",
      " - iteration 14 scored 0.2206 with: {'k1': 1.2433964265691286, 'b': 0.44356562662805726}\n",
      " - iteration 15 scored 0.2156 with: {'k1': 3.100612400611909, 'b': 0.9849404289368413}\n",
      " - iteration 16 scored 0.2257 with: {'k1': 4.248042138475732, 'b': 0.9035284880309848}\n",
      " - iteration 17 scored 0.2224 with: {'k1': 1.5765807997258139, 'b': 0.8720332943348184}\n",
      " - iteration 18 scored 0.2305 with: {'k1': 2.820111431030238, 'b': 0.5168856770938441}\n",
      " - iteration 19 scored 0.2224 with: {'k1': 2.1959597161860107, 'b': 0.9250145634446965}\n",
      " - iteration 20 scored 0.2257 with: {'k1': 4.442190681266682, 'b': 0.9260152008360161}\n",
      " - iteration 21 scored 0.2242 with: {'k1': 3.064655836349819, 'b': 0.3791113353101573}\n",
      " - iteration 22 scored 0.2187 with: {'k1': 3.5202769215682608, 'b': 0.9588940533178607}\n",
      " - iteration 23 scored 0.2325 with: {'k1': 5.0, 'b': 0.7043761223003595}\n",
      " - iteration 24 scored 0.2159 with: {'k1': 0.5095249433797535, 'b': 0.9952556818182101}\n",
      " - iteration 25 scored 0.2283 with: {'k1': 4.99733655784174, 'b': 0.5513516063009762}\n",
      " - iteration 26 scored 0.2353 with: {'k1': 3.0693561332209263, 'b': 0.7097705952925664}\n",
      " - iteration 27 scored 0.2302 with: {'k1': 4.997079968717751, 'b': 0.8338225591267308}\n",
      " - iteration 28 scored 0.2349 with: {'k1': 2.9298189101138057, 'b': 0.6705355989029556}\n",
      " - iteration 29 scored 0.2286 with: {'k1': 3.9017616725688504, 'b': 0.5275669866319284}\n",
      " - iteration 30 scored 0.2126 with: {'k1': 0.5083768089070996, 'b': 0.3051975488098463}\n",
      " - iteration 31 scored 0.2335 with: {'k1': 3.057438645555967, 'b': 0.7943805950296335}\n",
      " - iteration 32 scored 0.2356 with: {'k1': 3.4996216258157684, 'b': 0.7046625041391483}\n",
      " - iteration 33 scored 0.2130 with: {'k1': 4.988190005294321, 'b': 0.301967374589563}\n",
      " - iteration 34 scored 0.2157 with: {'k1': 0.511035678225668, 'b': 0.5863790923927636}\n",
      " - iteration 35 scored 0.2206 with: {'k1': 3.6684915070895987, 'b': 0.300110477096296}\n",
      " - iteration 36 scored 0.2205 with: {'k1': 4.989302876768119, 'b': 0.9832605278104865}\n",
      " - iteration 37 scored 0.2305 with: {'k1': 2.3444431239676398, 'b': 0.6014003085957186}\n",
      " - iteration 38 scored 0.2325 with: {'k1': 2.4639270689494523, 'b': 0.7717536517097305}\n",
      " - iteration 39 scored 0.2358 with: {'k1': 3.4589142889460534, 'b': 0.7043929438792035}\n",
      " - iteration 40 scored 0.2329 with: {'k1': 4.415526839360014, 'b': 0.6737248394761717}\n",
      "Best score: 0.2358\n",
      "Best params: {'k1': 3.4589142889460534, 'b': 0.7043929438792035}\n",
      "Final params: {'k1': 3.4589142889460534, 'b': 0.7043929438792035}\n",
      "\n",
      "CPU times: user 37.3 s, sys: 9.16 s, total: 46.4 s\n",
      "Wall time: 7min 13s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "\n",
    "_, best_params, _, metadata = optimize_bm25_mrr100(es, max_concurrent_searches, index, template_id, query_params,\n",
    "    config_space=Config.parse({\n",
    "        'method': 'bayesian',\n",
    "        'num_iterations': 40,\n",
    "        'num_initial_points': 20,\n",
    "        'space': {\n",
    "            'k1': { 'low': 0.5, 'high': 5.0 },\n",
    "            'b': { 'low': 0.3, 'high': 1.0 },\n",
    "        }\n",
    "    }))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here's a look at the parameter space, which is easy to plot here since there are just two parameters. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "_ = plot_objective(metadata, sample_source='result')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Evaluation with: MRR@100\n",
      "Score: 0.2594\n",
      "CPU times: user 1.92 s, sys: 534 ms, total: 2.45 s\n",
      "Wall time: 34.2 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "\n",
    "set_bm25_parameters(es, index, **best_params)\n",
    "\n",
    "_ = evaluate_mrr100_dev(es, max_concurrent_searches, index, template_id, query_params)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Interesting that we do see an improvement but it's not very significant. One hypothesis is that maybe our analyzers are doing work that means there's not much left to tune. Let's try this again but using the default analyzers with the index `msmarco-document.defaults`.\n",
    "\n",
    "First we set the baseline that we're comparing against. We expect it to be lower than the baseline with the custom analyzers. We saw this in the \"Analyzers\" notebook as well already."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Evaluation with: MRR@100\n",
      "Score: 0.2403\n",
      "CPU times: user 2.19 s, sys: 687 ms, total: 2.88 s\n",
      "Wall time: 4min 12s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "\n",
    "set_bm25_parameters(es, index_defaults, **default_bm25_params)\n",
    "\n",
    "_ = evaluate_mrr100_dev(es, max_concurrent_searches, index_defaults, template_id, query_params)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's optimize BM25. Before we do that, let's also increase the possible range of `k1` to make sure we really see a maximum score from somewhere within the range and not at a maximum or minumum value in the range."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Optimizing parameters\n",
      " - metric: MRR@100\n",
      " - queries: data/msmarco-document-sampled-queries.1000.tsv\n",
      " - queries: data/msmarco/document/msmarco-doctrain-qrels.tsv\n",
      " - iteration 2 scored 0.1971 with: {'k1': 0.9, 'b': 0.4}\n",
      " - iteration 3 scored 0.2322 with: {'k1': 9.366588476277936, 'b': 0.9122525300318791}\n",
      " - iteration 4 scored 0.2316 with: {'k1': 7.686680435518605, 'b': 0.965864493675082}\n",
      " - iteration 5 scored 0.2311 with: {'k1': 4.708495188944252, 'b': 0.9897547197883692}\n",
      " - iteration 6 scored 0.2193 with: {'k1': 2.2191277453389286, 'b': 0.5833472558883774}\n",
      " - iteration 7 scored 0.2075 with: {'k1': 1.8637850192899095, 'b': 0.33066321867136744}\n",
      " - iteration 8 scored 0.2162 with: {'k1': 8.500016824528396, 'b': 0.4732893649921234}\n",
      " - iteration 9 scored 0.2334 with: {'k1': 8.695331165873956, 'b': 0.777763765282391}\n",
      " - iteration 10 scored 0.2211 with: {'k1': 6.6069084823926785, 'b': 0.4931126256092313}\n",
      " - iteration 11 scored 0.2323 with: {'k1': 3.9716925801549317, 'b': 0.789458535906953}\n",
      " - iteration 12 scored 0.2296 with: {'k1': 7.920852515269264, 'b': 0.6185896788819574}\n",
      " - iteration 13 scored 0.2216 with: {'k1': 8.915241868366156, 'b': 0.5437007468174074}\n",
      " - iteration 14 scored 0.2330 with: {'k1': 5.392068599651512, 'b': 0.9186285857951679}\n",
      " - iteration 15 scored 0.2295 with: {'k1': 3.533909409201588, 'b': 0.7528902498382744}\n",
      " - iteration 16 scored 0.2244 with: {'k1': 8.8184645432699, 'b': 0.5799126262153195}\n",
      " - iteration 17 scored 0.2273 with: {'k1': 2.8135971669290103, 'b': 0.7889466377425964}\n",
      " - iteration 18 scored 0.2014 with: {'k1': 9.145845177402188, 'b': 0.31185829070298027}\n",
      " - iteration 19 scored 0.2315 with: {'k1': 4.4328876802271875, 'b': 0.9507508612887927}\n",
      " - iteration 20 scored 0.2320 with: {'k1': 9.352259421691345, 'b': 0.8344089113424735}\n",
      " - iteration 21 scored 0.2273 with: {'k1': 3.1522234771907107, 'b': 0.6110758904141731}\n",
      " - iteration 22 scored 0.2340 with: {'k1': 7.3374384483422, 'b': 0.7719563621035682}\n",
      " - iteration 23 scored 0.2326 with: {'k1': 8.767607027519459, 'b': 0.8774312063539391}\n",
      " - iteration 24 scored 0.2313 with: {'k1': 7.922646685993378, 'b': 0.9985661801837202}\n",
      " - iteration 25 scored 0.2131 with: {'k1': 4.389625903062928, 'b': 0.3542951941958561}\n",
      " - iteration 26 scored 0.1938 with: {'k1': 0.6205448165411873, 'b': 0.6224925769663106}\n",
      " - iteration 27 scored 0.2287 with: {'k1': 3.7684467183155284, 'b': 0.600271959696131}\n",
      " - iteration 28 scored 0.2174 with: {'k1': 2.1701193887485744, 'b': 0.9999488081108343}\n",
      " - iteration 29 scored 0.2354 with: {'k1': 5.828159898858229, 'b': 0.7719838762662773}\n",
      " - iteration 30 scored 0.2300 with: {'k1': 9.9827068363004, 'b': 0.989345590975901}\n",
      " - iteration 31 scored 0.2286 with: {'k1': 9.984714107787202, 'b': 0.6861408100601032}\n",
      " - iteration 32 scored 0.1973 with: {'k1': 0.5195974810639052, 'b': 0.9953501455735756}\n",
      " - iteration 33 scored 0.2303 with: {'k1': 6.195281827906322, 'b': 0.9993976796079878}\n",
      " - iteration 34 scored 0.2341 with: {'k1': 5.290242371701985, 'b': 0.652192471490742}\n",
      " - iteration 35 scored 0.2088 with: {'k1': 9.998266803887867, 'b': 0.4339358294845449}\n",
      " - iteration 36 scored 0.2347 with: {'k1': 5.449034480156674, 'b': 0.7552450332007592}\n",
      " - iteration 37 scored 0.2071 with: {'k1': 6.327982115527028, 'b': 0.30056887214460487}\n",
      " - iteration 38 scored 0.2339 with: {'k1': 6.528609504538238, 'b': 0.6803617299895912}\n",
      " - iteration 39 scored 0.2370 with: {'k1': 5.994170123620659, 'b': 0.7581664207056278}\n",
      " - iteration 40 scored 0.2364 with: {'k1': 6.1417373498200725, 'b': 0.7747204729965538}\n",
      " - iteration 41 scored 0.2329 with: {'k1': 9.997230190691027, 'b': 0.8357271023009853}\n",
      " - iteration 42 scored 0.2333 with: {'k1': 6.778389330336129, 'b': 0.8748418805014009}\n",
      " - iteration 43 scored 0.2295 with: {'k1': 9.087010044489327, 'b': 0.9973373546527946}\n",
      " - iteration 44 scored 0.2369 with: {'k1': 5.971570075456772, 'b': 0.7608668317330948}\n",
      " - iteration 45 scored 0.2369 with: {'k1': 5.97943054666231, 'b': 0.7611566503940015}\n",
      " - iteration 46 scored 0.2276 with: {'k1': 3.5784090801590605, 'b': 0.9976789751466888}\n",
      " - iteration 47 scored 0.2288 with: {'k1': 5.073838019026589, 'b': 0.5559158529843481}\n",
      " - iteration 48 scored 0.1793 with: {'k1': 0.5574413687903708, 'b': 0.30200774154371435}\n",
      " - iteration 49 scored 0.2178 with: {'k1': 3.164686951327865, 'b': 0.459305905707028}\n",
      " - iteration 50 scored 0.2342 with: {'k1': 4.819909710076562, 'b': 0.7812274358256605}\n",
      "Best score: 0.2370\n",
      "Best params: {'k1': 5.994170123620659, 'b': 0.7581664207056278}\n",
      "Final params: {'k1': 5.994170123620659, 'b': 0.7581664207056278}\n",
      "\n",
      "CPU times: user 54 s, sys: 14.3 s, total: 1min 8s\n",
      "Wall time: 13min 50s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "\n",
    "_, best_params, _, metadata = optimize_bm25_mrr100(es, max_concurrent_searches, index_defaults, template_id, query_params,\n",
    "    config_space=Config.parse({\n",
    "        'method': 'bayesian',\n",
    "        'num_iterations': 50,\n",
    "        'num_initial_points': 25,\n",
    "        'space': {\n",
    "            'k1': { 'low': 0.5, 'high': 10.0 },\n",
    "            'b': { 'low': 0.3, 'high': 1.0 },\n",
    "        }\n",
    "    }))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "_ = plot_objective(metadata, sample_source='result')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Evaluation with: MRR@100\n",
      "Score: 0.2661\n",
      "CPU times: user 2 s, sys: 651 ms, total: 2.65 s\n",
      "Wall time: 1min 6s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "\n",
    "set_bm25_parameters(es, index_defaults, **best_params)\n",
    "\n",
    "_ = evaluate_mrr100_dev(es, max_concurrent_searches, index_defaults, template_id, query_params)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "That's a much larger improvement over the baseline, and actually this optimized version with the default analyzers beats the tuned version with the custom analyzers! Goes to show you that you can't make assumptions — you need to test your hypothesis!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Conclusion"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Before we wrap up, it's good to set all the indices back to their default values, in case we use those indices for other experiments."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "set_bm25_parameters(es, index, **default_bm25_params)\n",
    "set_bm25_parameters(es, index_defaults, **default_bm25_params)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We've shown a very simple but principled way to tune BM25 parameters `k1` and `b`. We've used a similar approach as when optimizing query parameters. In this case, it was useful to rely on Bayesian optimization since we set a pretty wide range over parameters. Stepping through each 1/10th or 1/100th of each parameter in a grid search would be very time consuming indeed."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
